Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

serial port αντικείμενο να υπάρχει σε όλες τις φόρμες της εφαρμογής.

Îåêßíçóå áðü ôï ìÝëïò DaltonGR. Τελευταία δημοσίευση από το μέλος eliasm στις 25-11-2008, 17:47. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-10-2008, 15:07 45693

    serial port αντικείμενο να υπάρχει σε όλες τις φόρμες της εφαρμογής.

    Καλημέρα,

    Έχω μια απορία, πώς θα μπρέσω όταν ανοίγει η εφαρμογή μου να δημιουργείτε μια σειριακή πόρτα να ανοίγει και οποιαδήποτε φόρμα και αν ανοίξει, πάντα για το ίδιο instance της εφαρμογής, να μπορεί να διαβάσει τα δεδομένα που έρχονται;
    Ρωτάω αυτό επειδή θέλω όταν ανοίγει η εφαρμογή να αρχικοποιεί μια σειριακή πόρτα στην COM1 και να διαβάζει δεδομένα που έρχονται σε αυτή.Οποια φόρμα και αν ανοίξει μέσα απο το μενού να μπορεί να διαβάσει, χωρίς να ανόιγω διαφορετική σειριακή πόρτα σε κάθε φόρμα.

    Ευχαριστώ εκ των προτέρων.

  •  23-10-2008, 21:41 45700 σε απάντηση της 45693

    Απ: serial port αντικείμενο να υπάρχει σε όλες τις φόρμες της εφαρμογής.

    Όχι ότι δεν υπάρχει τρόπος να έχεις μία και μοναδική σειριακή, αλλά γιατί να έχεις πρόσβαση σε αυτή από κάθε φόρμα? Κάθε φόρμα χειρίζεται τη θύρα με διαφορετικό τρόπο? Θέλεις δύο φόρμες να ακούνε ή να μιλάνε με τη θύρα ταυτόχρονα? Μάλλον πρέπει να ξανασκεφτείς τη σχεδίαση σου.

    Εκτός και αν χρησιμοποιείς τη θύρα για διαφορετικούς λόγους σε κάθε φόρμα (κάτι που ακούγεται περίεργο) ή θέλεις πολλές φόρμες να παίζουν με την ίδια θύρα ταυτόχρονα (που ακούγεται παράλογο) είναι καλύτερα να κρύψεις τη θύρα μέσα σε μία μόνο κλάση. Η  κλάση αυτή θα είναι υπεύθυνη και για το άνοιγμα/κλείσιμο της θύρας αλλά κυρίως για να υλοποιεί τις λειτουργίες για τις οποίες θέλεις τη θύρα. Όχι κάθε φόρμα ξεχωριστά, αυτή η κλάση και μόνο. Για παράδειγμα, αν θέλεις να μιλήσεις με ένα GPS η κλάση αυτή θα πρέπει να έχει κάποιο event που σηκώνει κάθε φορά που δέχεται συντεταγμένες. Αν θέλεις να στείλεις μηνύματα μέσω κάποιου modem, η κλάση αυτή θα έχει μεθόδους SendMessage, ReceiveMessage. Καμμία άλλη κλάση ή φόρμα δεν θα πρέπει ούτε να χρησιμοποιεί ούτε καν να ξέρει ότι υπάρχει η σειριακή.

    Η υπόλοιπη εφαρμογή σου θα πρέπει να επικοινωνεί με τη σειριακή μόνο μέσω αυτής της κλάσης. Μπορείς να φτιάξεις ένα instance όταν ξεκινάει η εφαρμογή σου και να το περνάς σε κάθε φόρμα ως παράμετρο π.χ. στον constructor, ή ως property. Κάθε φόρμα μετά θα καλεί τις κατάλληλες μεθόδους σε αυτή την κλάση.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  23-10-2008, 22:21 45705 σε απάντηση της 45700

    Απ: serial port αντικείμενο να υπάρχει σε όλες τις φόρμες της εφαρμογής.

    Υ.Γ. Υπάρχει το Singleton pattern το οποίο σου επιτρέπει να φτιάξεις μία κλάση η οποία θα έχει πάντα ένα και μοναδικό instance και πρόσβαση σε αυτό από ένα και μόνο σημείο. Για παράδειγμα:

    public sealed class GpsController
    {
       static readonly GpsControllerinstance=new GpsController();

       static GpsController(){}

       GpsController(){}

       public static Instance
       {
          get
          {
             return instance;
          }
       }
    }

    Η παραπάνω κλάση δεν μπορεί να δημιουργηθεί με new GpsController γιατί ο constructor είναι private. Ο μόνος τρόπος να δημιουργηθεί είναι με την GpsController.Instance . Έτσι εξασφαλίζεται ότι θα υπάρχει πάντα μόνο ένας GpsController.

    Το καλό του Singleton είναι ότι οποιαδήποτε κλάση θέλει να χρησιμοποιήσει τον GpsController απλά καλεί την GpsController.Instance. Το κακό είναι ότι αν είναι κανείς τσαπατσούλης δεν έχει έλεγχο στο ποιός καλεί τον GpsController και πότε. Μπορεί άνετα για παράδειγμα κάποιος να καλέσει τον GpsController σε ένα private method μίας κλάσης με 1000 γραμμές και να μην φαίνεται πουθενά ότι τώρα η κλάση εξαρτάται πλέον από τον GpsController.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-11-2008, 13:51 46258 σε απάντηση της 45693

    Απ: serial port αντικείμενο να υπάρχει σε όλες τις φόρμες της εφαρμογής.

    Έχω μια κλάση GPSClass στην οποία ορίζω μια σεριακή θύρα.

     Public Sub New()
            Try
                GPSserial.PortName = "COM1"
                GPSserial.BaudRate = 9600
                If Not GPSserial.IsOpen Then
                    GPSserial.Open()
                End If
            Catch ex As Exception

            End Try
        End Sub
    έτσι αρχικοποιώ ένα αντικείμενο GPSClass στην main form  της εφαρμογής μου. σε αυτή την κλάση έχω το data receive event της σειριακής θυρας. Αυτό που θέλω εγώ είναι να αρχικοποιώ ένα τέτοι αντικείμενο και οποιαδήποτε φόρμα στην εφαρμογή μου και να ανοίξω να μπορεί να έχει πρόσβαση στα δεδομένα που δέχεται αυτή η θύρα. Το κάνω αυτό για να μήν ανοίγω σε κάθε φόρμα μια θύρα και να την κλείνω όταν ανοίγω μια νέα φόρμα.Ξέρω ότι η λύση είναι προφανής αλλα δεν μπορώ να την δώ.
    στο data receive της θύρας έχω
      If GPSserial.IsOpen Then
                Try
                    Buffer = GPSserial.ReadLine
                    Parse(Buffer)
                Catch exep As Exception
                  
                End Try
            End If
    η ρουτίνα parse απλώς διαχωρίζει τις διαφορετικές προτάσεις που δέχεται απο το GPS και ανάλογα με ποία πρόταση είναι κάνει raise ένα αντίστοιχο event.

    Ευχαριστώ και πάλι.
  •  25-11-2008, 17:47 46465 σε απάντηση της 46258

    Απ: serial port αντικείμενο να υπάρχει σε όλες τις φόρμες της εφαρμογής.

    Μιας και έχω αντιμετωπίσει ακριβώς το ίδιο πρόβλημα, θα σου πω και για τα δύο

    Το να θέλεις να έχεις πρόσβαση στο GPS από οποιαδήποτε φόρμα λύνεται σαφώς καλύτερα με singleton, αν και θέλει πολύ προσοχή και όχι τσαπατσουλιές και πολύ πιο εύκολα και απλά αν και κάποιες φόρες αργεί να ανοίξει με την το να καλείς σε κάθε φόρμα την κλάση  του GPS

    Αλλά νομίζω  και τελικά αυτό ήταν το καλύτερο, αντί να πάμε με κατευθείαν στην θύρα υλοποιήσαμε την εφαρμογή με την χρήση  του

    GPS Intermediate Driver

    Για περισσότερες πληροφορίες δες αυτό το link

    http://msdn.Microsoft.com/en-us/library/ms850332.asp


    Don't try to argue with the machine
    Elias Markelis
    MCPD,MCT
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems